<?php

/**
 * Controleur qui s'occupe de la salle de chat 
 */
class IndexController extends Zend_Controller_Action {

    protected $_mapperUsersConnected;

    public function init() {
        $this->view->isConnected = Zend_Auth::getInstance()->hasIdentity() ? 'true' : 'false';
        $this->view->login = Zend_Auth::getInstance()->hasIdentity() ? Zend_Auth::getInstance()->getIdentity() : '';
        $this->_mapperUsersConnected = new ZendChat_Model_UsersConnectedMapper();
        $this->view->usersConnected = $this->_mapperUsersConnected->getAllLogins();
    }

    /**
     * Affiche la salle de chat avec : 
     *  - un formulaire d'auhentification 
     */
    public function indexAction() {
        // Formulaire d'authentification
        $form = new ZendChat_Form_Connection();
        $this->view->form = $form;
    }

    /**
     * Fonction qui vérifie si un utilisateur a le droit de se connecter
     * 
     * Rq : Cette fonction ne peut être appelée que par des fonctions ajax 
     */
    public function checkauhentificationAction() {
        $request = $this->getRequest();

        // Si ce n'est pas un appel ajax, on redirige vers l'index
        if (!$request->isXmlHttpRequest()) {
            return $this->_helper->redirector('index', 'index');
        }
        // si ce n'est pas du post avec un 'login' et un 'pwd', on envoie un json avec une erreur
        if (!$request->isPost()) {
            $result = array(
                'status' => 'error',
                'message' => 'url mal formée : doit contenir du post'
            );
        } else {
            $formData = $request->getPost();
            if (!isset($formData['login']) || !isset($formData['pwd'])) {
                $result = array(
                    'status' => 'error',
                    'message' => 'url mal formée : doit contenir un champ login et pwd en post'
                );
            } else {
                $form = new ZendChat_Form_Connection();
                // Si l'authentification a echoué
                if (!$form->isValid($formData)) {
                    $result = array(
                        'status' => 'error',
                        'message' => "Erreur d'authentificaion"
                    );
                } else {
                    // L'authentification a réussi           
                    Zend_Auth::getInstance()->getStorage()->write($formData['login']);
                    $this->_mapperUsersConnected->addUser($formData['login']);
                    $usersConnected[] = $formData['login'];
                    $result = array(
                        'status' => 'succes',
                        'message' => 'Vous êtes maintenant connecté'
                    );
                }
            }
        }
        return $this->_helper->json($result);
    }

    /**
     * Action permettant à l'utilisateur de se déconnecter
     * 
     * Rq : Cette fonction ne peut être appelée que par des fonctions ajax 
     */
    public function disconnectAction() {
        $request = $this->getRequest();

        // Si ce n'est pas un appel ajax, on redirige vers l'index
        if (!$request->isXmlHttpRequest()) {
            return $this->_helper->redirector('index', 'index');
        }

        $this->_mapperUsersConnected->removeUser(Zend_Auth::getInstance()->getIdentity());
        Zend_Auth::getInstance()->clearIdentity();
        return $this->_helper->json(array('message' => 'Vous êtes maintenant déconnecté'));
    }

    /**
     * Action permettant de récupérer la liste des utilisateurs connectés 
     * 
     * Rq : Cette fonction ne peut être appelée que par des fonctions ajax
     */
    public function listusersconnectedAction() {
        $request = $this->getRequest();

        // Si ce n'est pas un appel ajax, on redirige vers l'index
        if (!$request->isXmlHttpRequest()) {
            return $this->_helper->redirector('index', 'index');
        }
        return $this->_helper->json($this->view->usersConnected);
    }

    /**
     * Action permettant de récupérer la liste des utilisateurs connectés d'envoyer un message
     * 
     * Rq : Cette fonction ne peut être appelée que par des fonctions ajax
     */
    public function sendmessageAction() {
        $request = $this->getRequest();

        // Si ce n'est pas un appel ajax, on redirige vers l'index
        if (!$request->isXmlHttpRequest()) {
            return $this->_helper->redirector('index', 'index');
        }

        if (!$request->isPost()) {
            $retour = array('status' => 'error', 'message' => "Erreur de soumission du message");
            Zend_Registry::get('logger')->err("Tentative d'appel de la fonction /index/sendmessage en non post");
        } else {
            $formData = $request->getPost();
            if (!isset($formData['text'])) {
                $retour = array('status' => 'error', 'message' => "Erreur de soumission du message");
                Zend_Registry::get('logger')->err("Tentative d'appel de la fonction /index/sendmessage sans key 'text' en post");
            } elseif (Zend_Auth::getInstance()->hasIdentity()) {
                // On crée le message à sauvegarder
                $message = new ZendChat_Model_Message();
                $message->setDate(date('Y-m-d H:i:s'));
                $message->setText($formData['text']);
                $message->setUserlogin(Zend_Auth::getInstance()->getIdentity());

                $mapperMessage = new ZendChat_Model_MessageMapper();
                $mapperMessage->save($message);
                $retour = array('status' => 'success');
            } else {
                $retour = array('status' => 'error', 'message' => "Vous n'êtes pas identifié");
            }
        }
        return $this->_helper->json($retour);
    }

    /**
     * Action permettant de récupérer les 50 derniers messages
     * 
     * Rq : Cette fonction ne peut être appelée que par des fonctions ajax
     */
    public function getmessagesAction() {
        $request = $this->getRequest();

        // Si ce n'est pas un appel ajax, on redirige vers l'index
        if (!$request->isXmlHttpRequest()) {
            return $this->_helper->redirector('index', 'index');
        }
        
        $mapperMessage = new ZendChat_Model_MessageMapper();
        $messages = $mapperMessage->getAll();
        foreach($messages as $message) {
            $result[] = $message->toArray();
        }
        
        $this->_helper->json($result);
    }

}

